package com.egg.common.util;

import cn.hutool.core.util.ObjectUtil;
import com.egg.common.core.constant.StringPool;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 转换工具类
 *
 * @author east
 */
@Slf4j
public class ConvertUtil {


    /**
     * List 转 String
     *
     * @param list
     * @return string
     */
    public static String listToStr(Collection<? extends Serializable> list) {
        if (ObjectUtil.isEmpty(list)) {
            return "";
        }
        return listToStr(list, StringPool.COMMA);
    }

    public static String listToStr(Collection<? extends Serializable> list, String delimiter) {
        if (ObjectUtil.isEmpty(list)) {
            return "";
        }
        return list.stream()
                .filter(o -> ObjectUtil.isNotEmpty(o))
                .map(o -> o.toString())
                .collect(Collectors.joining(delimiter));
    }

    /**
     * String 转 List
     *
     * @param str  字符串
     * @param clzz 转出的类型
     * @param <T>
     * @return
     */
    public static <T> List<T> strToList(String str, Class<T> clzz) {
        if (ObjectUtil.isEmpty(str)) {
            return Collections.emptyList();
        }
        return strToList(str, StringPool.COMMA, clzz);
    }

    /**
     * String 转 List
     *
     * @param input     需要转换的字符串
     * @param delimiter 分隔符
     * @param clazz     转出类型
     * @param <T>
     * @return
     */
    public static <T> List<T> strToList(String input, String delimiter, Class<T> clazz) {
        List<T> result = new ArrayList<>();
        String[] elements = input.split(delimiter);
        for (String element : elements) {
            try {
                T obj = clazz.getConstructor(String.class).newInstance(element.trim());
                result.add(obj);
            } catch (Exception e) {
                // 错误处理，如果转换失败可以根据需求进行处理
                log.error("String转List 原始值 {} 失败原因 {}", input, e);
            }
        }
        return result;
    }


}